Google Cloud StorageのバケットIPフィルタリングを試してみる
はじめに
データアナリティクス事業本部のkobayashiです。
Google Cloud StorageでBucketごとにアクセス元IPで制限をかけるバケットIPフィルタリングがPreviewになっていたので早速試してみたのでその内容をまとめます。
Cloud StorageのバケットIPフィルタリングとは
Cloud Storage のバケットIPフィルタリングは、データへのアクセスを管理するセキュリティ機能になります。IPv4/IPv6のアドレス範囲やGoogle Cloud VPCに基づいて、バケットへのアクセスを制限することができます。これにより、不正アクセスを防ぎ、機密データを強固に保護することができるようになります。
IPフィルタリング機能は、パブリックインターネットアクセスと VPC アクセスの2つのルールタイプで構成されます。これにより、特定の IP アドレスや VPC からのアクセスのみを許可し、データのセキュリティを向上させることができます。
まだPreviewなので使用できるロケーションは限定されており残念ながら東京(asia-northeast1)では使用できない状態です。
Bucket IP filtering|Supported locations
では早速試してみます。
バケットIPフィルタリングを試してみる
バケットIPフィルタリングを設定したBucketを作成するには次のロールが必要なのでまずはカスタムロールを作成します。
storage.buckets.create
storage.buckets.setIpFilter
$ gcloud iam roles create customStorageRole \
--project={プロジェクトID} \
--title="Custom Storage Role" \
--description="Role for creating buckets with IP filters" \
--permissions=storage.buckets.create,storage.buckets.setIpFilter
作成したカスタムロールをユーザーに付与します。
$ gcloud projects add-iam-policy-binding {プロジェクトID} \
--member="user:{メールアドレス}" \
--role="projects/{プロジェクトID}/roles/customStorageRole" \
--condition=None
これでバケットIPフィルタリングを設定したBucketを作成できるようになったので次にBucketを作成します。先に書いたように現状(2024/11/24)では東京ロケーションではこの機能が使えないため、ロケーションをus-east1
に指定して作成してみます。
バケットIPフィルタリングの設定を記述したJSONファイルが必要なので公式ドキュメント バケットIPフィルタリング構成 を参考に設定します。
バケットIPフィルタリング構成は「パブリックIP範囲」と「VPCネットワーク」で別ブロックで指定できます。
パブリックIP範囲はその名の通りアクセス元のIPをCIDRブロックで指定してアクセスを許可できます。
VPCネットワークはVPCネットワーク名とIP範囲を指定することでVPC内のすべてのIPアドレス、またはVPC内の特定のIP範囲へのアクセスを許可できます。
今回はパブリックIP範囲でアクセス許可を行ってみます。
{
"mode": "Enabled",
"publicNetworkSource":
{
"allowedIpCidrRanges":
["192.0.1.0/24","192.0.2.0/24"]
}
}
$ gcloud alpha storage buckets create gs://BUCKET_NAME --location=us-east1 --ip-filter-file=ip-filter.json
これでバケットIPフィルタリングを設定したBucketを作成できましたのでまずは設定したIP範囲外からアクセスしてみます。
$ gcloud storage ls gs://cm-kobayshi-ip-filter
ERROR: (gcloud.storage.ls) [{メールアドレス}] does not have permission to access b instance [cm-kobayshi-ip-filter] (or it may not exist): There is an IP filtering condition that is preventing access to the resource. This command is authenticated as {メールアドレス} which is the active account specified by the [core/account] property.
すると上記のようなエラーが発生してIPフィルタリングが効いてアクセスが制限されていることがわかります。
マネージメントコンソールからアクセスしてみても公開アクセスが非表示
となってBucketにアクセスすることができません。
次にアクセス可能なIP範囲内から同じコマンドを実行すると問題なくBucketにアクセスできます。
$ gcloud storage ls gs://cm-kobayshi-ip-filter
gs://cm-kobayshi-ip-filter/sample.csv
マネコンからもBucketにアクセスすることができます。
バケットIPフィルタリングの注意点
バケットIPフィルタリングはBucket内のオブジェクトへのアクセスだけが制限されるだけではなく、Bucketに対するあらゆる操作に対してIPフィルタリングが有効になります。
そのため、バケットIPフィルタリングを更新・削除・確認することも制限されます。
$ gcloud alpha storage buckets update gs://cm-kobayshi-ip-filter --ip-filter-file=ip-filter.json # 更新
$ gcloud alpha storage buckets update gs://cm-kobayshi-ip-filter --clear-ip-filter # 削除
$ gcloud alpha storage buckets describe gs://cm-kobayshi-ip-filter --format="default(ip_filter_config)" # 確認
ERROR: (gcloud.alpha.storage.buckets.describe) [{メールアドレス}] does not have permission to access b instance [cm-kobayshi-ip-filter] (or it may not exist): There is an IP filtering condition that is preventing access to the resource. This command is authenticated as {メールアドレス} which is the active account specified by the [core/account] property.
更にはBucketの削除にもIPフィルタリングの制限がかかります。
$ gcloud storage rm --recursive gs://cm-kobayshi-ip-filter
Removing objects:
Completed 0
ERROR: (gcloud.storage.rm) [{メールアドレス}] does not have permission to access b instance [cm-kobayshi-ip-filter] (or it may not exist): There is an IP filtering condition that is preventing access to the resource. This command is authenticated as {メールアドレス} which is the active account specified by the [core/account] property.
したがって、IPフィルタリングで誤ったIP範囲をしていると一切操作のできないBucketが作成されてしまうので注意が必要です。
まとめ
GoogleCloudでBucketごとにアクセス元IPで制限をかけるバケットIPフィルタリングを試してみました。バケットIPフィルタリングを使うことでCloud Storageのアクセスを制限することができ、不正アクセスを防ぎ、機密データを強固に保護することが可能になるので適切に使っていくと良いと思います。
最後まで読んで頂いてありがとうございました。